package com.steven.test.exception;

import com.steven.test.enums.ResponseEnum;

/**
 * 自定义全局异常（TIPS：返回格式为统一返回结果集）
 *
 * @author qinxh
 * @date 2019/08/22
 */
public class GlobalException extends RuntimeException{
    
    private static final long serialVersionUID = 1L;

    private ResponseEnum responseEnum;

    public GlobalException(ResponseEnum responseEnum){

        super(responseEnum.getMessage());
        this.responseEnum = responseEnum;
    }

    public ResponseEnum geResponseEnum(){

        return responseEnum;
    }

    /**
     * 避免对api异常进行昂贵且无用的堆栈跟踪，需要覆写 fillInStackTrace。解决自定义异常性能差问题
     *
     * TIPS：通过fillInStackTrace()源码可知：
     *      1. 使用了synchronized修饰整个异常方法；
     *      2. 将异常追踪信息放到了堆栈中（想想JVM和线程）
     *
     * 因为对于自定义业务异常，我们只需要简单的知道一个描述问题的字符串即可，栈追踪信息对我们的意义并不大。而对于系统异常，
     * 追踪信息才是排查错误不可或缺的参考
     *
     * @return Throwable
     */
    @Override
    public Throwable fillInStackTrace() {

        return this;
    }
}